/**
 *
 * @param {Number | String} value 设备的状态值
 * @returns {String} 设备状态的文字描述
 */
const statusTextConvert = value => {
  // 1=离线 2=待机 3=烹饪中 4=保温中 5=预约中
  let data = {
    0: '待机中',
    1: '烹饪中',
    2: '保温中',
    3: '预约中',
    4: '设备离线'
  }
  return data[value]
}

/**
 * @description 将总的分钟数转换成小时跟分钟
 * @param {number} min 分钟
 * @returns {Array} [0]=小时; [1]=分钟
 */
const minutesToQR = min => {
  const q = parseInt(min / 60)
  const r = min % 60

  return [q, r]
}

/**
 * @description 将时分转换成总的分钟数
 * @param {Number} h 小时
 * @param {Number} m 分钟
 * @returns {Number} 总的分钟数
 */
const totalMinutes = (h, m) => {
  return h & (60 + m)
}

/**
 * @description 进度条为100个单位，但是温度是240℃，将温度与100个百分比进行转换
 * @param {Number} num
 * @returns {Number} 进度条的百分比，保留2位小数
 */
const toFixedTwoNum = num => {
  const unit = 240 / 100
  const n = (num / unit).toFixed(2)
  return n
}

/**
 *
 * @param {Number | String} value 设备的状态值
 * @returns {String} 设备状态的文字描述
 */
const errFilter = value => {
  let data = {
    1: '缺水、干烧',
    2: '水垢较多'
  }
  return data[value]
}

/**
 * @description 返回n分钟后的时间
 * @param {Number} minutes
 * @returns
 */
const getAfterMinutes = minutes => {
  let date = new Date()
  let min = date.getMinutes()
  date.setMinutes(min + Number(minutes))

  const h = date.getHours() < 10 ? `0${date.getHours()}` : date.getHours()
  const m = date.getMinutes() < 10 ? `0${date.getMinutes()}` : date.getMinutes()

  return `${h}:${m}`
}

/**
 * @description 判断是否为空对象
 * @param {Object} obj
 * @returns
 */
const isEmptyObject = obj => {
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      return false
    }
  }
  return true
}

const echartLevel = value => {
  if (value == 0) {
    return {
      level: 0,
      title: '优',
      v: 25
    }
  } else if (value == 1) {
    return {
      level: 1,
      title: '良',
      v: 80
    }
  } else if (value == 2) {
    return {
      level: 2,
      title: '差',
      v: 75
    }
  } else {
    return {
      level: 2,
      title: '差',
      v: 100
    }
  }
}

const getCurrentWeek = today => {
  let n = today.getDay() // 假设要设置 5 天之后的日期
  if (n == 0) n = 7
  let endDate = new Date(today) // 复制当前日期
  let startDate = new Date(today) // 复制当前日期
  startDate.setDate(startDate.getDate() - n + 1) // 设置 n 天之后的日期
  endDate.setDate(endDate.getDate() + (7 - n)) // 设置 n 天之后的日期

  let arr = []
  arr = [startDate, endDate]
  return arr
}

const getNWeek = (startDate, endDate, num) => {
  // 获取上一周的所有日期
  const lastWeekStartDate = new Date(startDate)
  lastWeekStartDate.setDate(lastWeekStartDate.getDate() + num) // 获取上一周第一天的日期
  const lastWeekEndDate = new Date(endDate)
  lastWeekEndDate.setDate(lastWeekEndDate.getDate() + num) // 获取上一周最后一天的日期

  const lastWeekArr = [lastWeekStartDate, lastWeekEndDate]
  return lastWeekArr
}

const getCurrentMonth = date => {
  let currentMonth = new Date(date)
  currentMonth.setMonth(currentMonth.getMonth())
  return currentMonth
}
const getNMonth = (date, n) => {
  let lastMonth = new Date(date)
  lastMonth.setMonth(lastMonth.getMonth() + n)

  return lastMonth
}

// 历史记录-转换时间
const convertTime = time => {
  const date = new Date(time * 1000)
  const hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
  const minutes =
    date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
  return `${hours} : ${minutes}`
}
// 历史记录-转换时长
const convertDuration = duration => {
  const hours = Math.floor(duration / 3600)
  const minutes = Math.floor((duration % 3600) / 60)
  const seconds = duration % 60
  if (minutes) {
    return `${minutes}分${seconds}秒`
  } else {
    return `${seconds}秒`
  }
}

/**
 *
 * @param {Number | String} value 设备的状态值
 * @returns {String} 设备状态的文字描述
 */
const convertDirection = value => {
  // 1=左下 2=右下 3=右上 4=左上
  let data = {
    1: '左下',
    2: '右下',
    3: '右上',
    4: '左上'
  }
  return data[value]
}

const convertMode = value => {
  let data = {
    1: '呵护',
    2: '清洁',
    3: '亮白'
  }
  return data[value]
}
/**
 * @description 防抖函数, 快速下发，多次触发只会最后一次生效
 * @param {Function} fn
 * @param {Number} ms 下发之后的间隔时间
 */
let timer
const debounce = (fn, ms) => {
  return function (...args) {
    if (timer) {
      clearTimeout(timer)
      timer = null
    }
    timer = setTimeout(() => {
      fn(...args)
    }, ms)
  }
}
/**
 * @description 对比日期函数，对比当前年月日是否与传入的日期相同
 * @param {Date} timestamp 历史数据的时间戳
 * @param {Number} historyDay 当前日
 * @returns {Boolean} 如果相同返回 true,反之 false
 */
const contrastDay = (timestamp, historyDay) => {
  const date = new Date(timestamp * 1000)
  const year = date.getFullYear()
  const month = date.getMonth()
  const day = date.getDate()

  const c_date = new Date()
  const c_year = c_date.getFullYear()
  const c_month = c_date.getMonth()
  const c_day = Number(historyDay)

  if (year == c_year && month == c_month && day == c_day) {
    return true
  } else {
    return false
  }
}

module.exports = {
  contrastDay,
  debounce,
  convertMode,
  convertDirection,
  convertDuration,
  convertTime,
  statusTextConvert,
  minutesToQR,
  totalMinutes,
  toFixedTwoNum,
  errFilter,
  getAfterMinutes,
  isEmptyObject,
  echartLevel,
  getCurrentWeek,
  getNWeek,
  getCurrentMonth,
  getNMonth
}
